//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// cl_new_v.1.0.cpp - Nova versao do programa cur_luz.cpp.
// Inclui o biblioteca de leitura de arquivos dataFileReader.h (Zabot A.)
// de modo que comentarios podem ser inseridos nos arquivos de entrada. Os
// comentarios devem ser precedidos de #.
// Este código deve invluir rotinas mais modernas de leitura de arquivos de
// entrada, possuir melhor capacidade de evitar e ou contarnar erros nos 
// arquivos de entrada assim como mais versatilidade para o modelo.
//
// Descrição de versao:
// v -> indica inicio de versao
// v.X -> primeiro X indica versao com mudancas bruscas
// v.X.X -> segundo X difere versoes de desenvolvimento
//
// Modo de utilizacao do programa:
// cl_new_v.X.X arq_in arq_out
//
// veja help para mais informacoes ou o arquivo 
// ~/astro_local/diarios/diarios_2007a.txt
//
// Tiago Ribeiro
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

#include <iostream>
#include <cmath>
#include <fstream>
#include <cmath>
#include <vector>
#include <sstream>
#include <string>
#include <cstring>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>

#include "light_curve.h"
//#include "light_curve.cpp"
//#include "roche.cpp"
//#include "dataFileReader_v0.1.1/dataFileReader.hpp"
#include "lib_mod.hpp"

using namespace std;

double oculta(vector<double>& pos, vector<double>& fase, Roche& STAR);

int main(int argc, char **argv)
{

	int stat = setenv("GSL_RNG_SEED",ntos<int>(getpid()).c_str(),1);
	
	char * descr = getenv("GSL_RNG_SEED");
	if (descr)
		cout<<"# - Value of GSL_RNG_SEED is: "<< descr<<endl;
	else {
		cout<<"# - GSL_RNG_SEED not defined, using default"<<endl;
	}
	
	gsl_rng_env_setup();
	
	const gsl_rng_type * _Trng = gsl_rng_default;
	gsl_rng * _rand = gsl_rng_alloc (_Trng);

	DataReader inpar(argc,argv);

	inpar.show_par(cout);


	Roche star_2(inpar.slaces(), inpar.org_par(0));
	Roche star_1(inpar.slaces(), inpar.org_par(1));
	//cout << "# - "<< star_2.ache_r(M_PI/2., 0.) << endl;
	//cout << "# - "<< star_1.ache_r(M_PI/2., 0.) << endl;
	double f0 = star_1.flux(0.0)+star_2.flux(0.0);
		
	 if(inpar.nspot() > 0) star_2.spot_maker();
	 
	 /*pixel wd;
	 wd.px=-1.0;
	 wd.py=0.0;
	 wd.pz=0.0;
	 wd.nx=1.0;
	 wd.ny=1.0; // isotropico
	 wd.nz=1.0;
	 wd.I=inpar.Irr()*inpar.Albedo();
	 cout << wd.I << endl;
	 cl2.albedo(wd);
	 */
	ofstream oo(argv[2]);
	
	if(!oo) {
		ostringstream erro;
		erro << "Arquivo de saida nao pode ser aberto\n\tArquivo: " 
		<< argv[2];
		aborta(erro.str());
	}
	
	inpar.show_par(oo);
	
	for (int i = 0; i < inpar.nfases(); i++){
		double flux = star_2.flux<Roche>(inpar.ff(i),star_1,oculta)+star_1.flux<Roche>(inpar.ff(i)-0.5,star_2,oculta);

		oo << inpar.ff(i) << " "
		<< flux+gsl_ran_gaussian(_rand, flux*inpar.fot_erro()) << " "
		<< flux*inpar.fot_erro() << endl;
		
	}
	
	
	oo.close();
	
	return 0;
	
	
}

double oculta(vector<double>& pos, vector<double>& fase, Roche& STAR)
{
	return STAR.oculta(pos,fase);
}
